package co.edu.usbcali.lidis.vista;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

import org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLJDBCDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;
import org.apache.mahout.cf.taste.model.JDBCDataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;
import org.postgresql.ds.PGPoolingDataSource;

import co.edu.usbcali.lidis.dataaccess.daoFactory.FachadaBaseDeDatos;
import co.edu.usbcali.lidis.modelo.Proyecto;
import co.edu.usbcali.lidis.modelo.Usuario;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;

@SuppressWarnings("serial")
public class PantallaInfoProyecto extends javax.swing.JFrame {
	private Proyecto[] proyectosArray = null;
	private int itemSeleccionado = 0;
	private Usuario usuario;
	Long idProyec = (long) 0;

	public PantallaInfoProyecto(int idUsuario, final Proyecto proyecto,
			List<Proyecto> proyectosRecomendados) {
		setUndecorated(true);
		usuario = new Usuario();
		usuario.setUsuId(idUsuario);
		initComponents(proyectosRecomendados);
		idProyec = proyecto.getProId();

		txtTitulo.setText(proyecto.getProTitulo());
		txtPalClaves.setText(proyecto.getProPalclave());
		txtObjGeneral.setText(proyecto.getProObjGeneral());
		txtObjEspec.setText(proyecto.getProObjEspecificos());
		txtMarcoTeorico.setText(proyecto.getProContenido());

		String path = System.getProperty("user.dir");
		Panel p = new Panel(path + "/imagenes/fondoProyecto.png");
		getContentPane().add(p, BorderLayout.CENTER);
		this.pack();
		setSize(800, 800);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void initComponents(List<Proyecto> proyecto) {

		proyectosArray = proyecto.toArray(new Proyecto[proyecto.size()]);

		String[] tituloProyectos = new String[proyecto.size()];

		for (int i = 0; i < proyectosArray.length; i++) {
			tituloProyectos[i] = proyectosArray[i].getProTitulo();
		}

		btnSalir = new javax.swing.JButton();
		txtTitulo = new javax.swing.JTextField();
		lblTitulo = new javax.swing.JLabel();
		lblTitulo.setForeground(Color.WHITE);
		lblPalClaves = new javax.swing.JLabel();
		lblPalClaves.setForeground(Color.WHITE);
		txtPalClaves = new javax.swing.JTextField();
		btnRecomendacion = new javax.swing.JButton();
		lblObjGeneral = new javax.swing.JLabel();
		lblObjGeneral.setForeground(Color.WHITE);
		lblObjEspec = new javax.swing.JLabel();
		lblObjEspec.setForeground(Color.WHITE);
		lblMarcoTeorico = new javax.swing.JLabel();
		jScrollPane1 = new javax.swing.JScrollPane();
		txtObjGeneral = new javax.swing.JTextArea(2,330);
		txtObjGeneral.setWrapStyleWord(true);
		txtObjGeneral.setLineWrap(true);
		jScrollPane2 = new javax.swing.JScrollPane();
		txtObjEspec = new javax.swing.JTextArea();
		txtObjEspec.setMaximumSize(new Dimension(351,94));
		txtObjEspec.setMinimumSize(new Dimension(351,94));
		jScrollPane3 = new javax.swing.JScrollPane();
		txtMarcoTeorico = new javax.swing.JTextArea();
		txtMarcoTeorico.setMaximumSize(new Dimension(351,155));
		txtMarcoTeorico.setMinimumSize(new Dimension(351,155));
		jScrollPane4 = new javax.swing.JScrollPane();
		jList1 = new javax.swing.JList(tituloProyectos);
		jLabel1 = new javax.swing.JLabel();
		jLabel2 = new javax.swing.JLabel();
		cmb_calificaciones = new javax.swing.JComboBox();
		btnCalificar = new javax.swing.JButton();
		btnCalificar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					boolean guardarCalificacion;
					double calificacion = 0;
					double calificarealizada = 0;
					int posiciomCalifi = 0;
					Long idProy = (long) 0;

					posiciomCalifi = cmb_calificaciones.getSelectedIndex();
					calificacion = Double.parseDouble((String) cmb_calificaciones
							.getItemAt(posiciomCalifi));
					idProy = idProyec;

					calificarealizada = FachadaBaseDeDatos.getInstance()
							.consultarCalificacion(usuario.getUsuId(), idProy);

					if (calificarealizada == 0) {
						guardarCalificacion = FachadaBaseDeDatos.getInstance()
								.calificarProyecto(usuario.getUsuId(), idProy, calificacion);
						if (guardarCalificacion) {
							JOptionPane.showMessageDialog(null,
									"El proyecto se calificó exitosamente.", "OK",
									JOptionPane.INFORMATION_MESSAGE);

						} else {
							throw new Exception("El proyecto no se calificó.");
						}
					} else {
						JOptionPane.showMessageDialog(null,
								"Este usuario ya califico este proyecto con un puntaje de:  "
										+ calificarealizada, "OK",
								JOptionPane.INFORMATION_MESSAGE);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}
		});

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setTitle("Información Proyectos");
		setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
		setForeground(java.awt.Color.white);
		setIconImage(getIconImage());

		btnSalir.setMnemonic('s');
		btnSalir.setText("Salir");
		btnSalir.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnSalirActionPerformed(evt);
			}
		});

		lblTitulo.setText("Título de Proyecto:");

		lblPalClaves.setText("Palabras Claves:");

		btnRecomendacion.setMnemonic('1');
		btnRecomendacion.setText("Ver Proyecto");

		btnRecomendacion.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnRecomendacionActionPerformed(evt);
			}
		});

		lblObjGeneral.setText("Objetivo General:");

		lblObjEspec.setText("Objetivos Específicos:");

		lblMarcoTeorico.setText("Marco Teórico:");

		txtObjGeneral.setColumns(20);
		txtObjGeneral.setRows(3);
		txtObjGeneral.setLineWrap(true);
		jScrollPane1.setViewportView(txtObjGeneral);

		txtObjEspec.setColumns(20);
		txtObjEspec.setRows(5);
		txtObjEspec.setLineWrap(true);
		jScrollPane2.setViewportView(txtObjEspec);

		txtMarcoTeorico.setColumns(20);
		txtMarcoTeorico.setRows(5);
		txtMarcoTeorico.setLineWrap(true);
		jScrollPane3.setViewportView(txtMarcoTeorico);

		jScrollPane4.setViewportView(jList1);

		jLabel1.setFont(new java.awt.Font("Tahoma", 0, 12));
		jLabel1.setText("Otros proyectos relacionados con este proyecto son:");

		jLabel2.setFont(new java.awt.Font("Tahoma", 0, 12));
		jLabel2.setText("Calificar este proyecto (1 - 5):");

		cmb_calificaciones.setModel(new javax.swing.DefaultComboBoxModel(
				new String[] { "1.0", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0",
						"4.5", "5.0" }));

		btnCalificar.setMnemonic('1');
		btnCalificar.setText("Calificar");

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		getContentPane().setLayout(layout);
		layout.setHorizontalGroup(layout
				.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGap(28, 28, 28)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING,
												false)
												.addComponent(
														lblPalClaves,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														Short.MAX_VALUE)
												.addComponent(
														lblObjGeneral,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														Short.MAX_VALUE)
												.addComponent(
														lblObjEspec,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														Short.MAX_VALUE)
												.addComponent(
														lblMarcoTeorico,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														Short.MAX_VALUE)
												.addComponent(
														lblTitulo,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														Short.MAX_VALUE))
								.addGap(18, 18, 18)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING,
												false)
												.addComponent(txtPalClaves)
												.addComponent(txtTitulo)
												.addComponent(
														jScrollPane1,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														351, Short.MAX_VALUE)
												.addComponent(jScrollPane2)
												.addComponent(jScrollPane3))
								.addGap(64, 64, 64)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addComponent(
														jLabel1,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														Short.MAX_VALUE)
												.addComponent(jScrollPane4)
												.addGroup(
														layout.createSequentialGroup()
																.addGap(90, 90,
																		90)
																.addComponent(
																		btnRecomendacion)
																.addGap(0,
																		0,
																		Short.MAX_VALUE))
												.addGroup(
														javax.swing.GroupLayout.Alignment.TRAILING,
														layout.createSequentialGroup()
																.addGroup(
																		layout.createParallelGroup(
																				javax.swing.GroupLayout.Alignment.TRAILING)
																				.addGroup(
																						layout.createSequentialGroup()
																								.addGap(0,
																										0,
																										Short.MAX_VALUE)
																								.addComponent(
																										btnCalificar))
																				.addComponent(
																						jLabel2,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						javax.swing.GroupLayout.DEFAULT_SIZE,
																						Short.MAX_VALUE))
																.addPreferredGap(
																		javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
																.addComponent(
																		cmb_calificaciones,
																		javax.swing.GroupLayout.PREFERRED_SIZE,
																		javax.swing.GroupLayout.DEFAULT_SIZE,
																		javax.swing.GroupLayout.PREFERRED_SIZE)
																.addGap(89, 89,
																		89)))
								.addGap(47, 47, 47))
				.addGroup(
						javax.swing.GroupLayout.Alignment.TRAILING,
						layout.createSequentialGroup()
								.addContainerGap(
										javax.swing.GroupLayout.DEFAULT_SIZE,
										Short.MAX_VALUE).addComponent(btnSalir)
								.addGap(366, 366, 366)));
		layout.setVerticalGroup(layout
				.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
				.addGroup(
						layout.createSequentialGroup()
								.addGap(136, 136, 136)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(lblTitulo)
												.addComponent(
														txtTitulo,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(lblPalClaves)
												.addComponent(
														txtPalClaves,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addGap(18, 18, 18)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addComponent(
														jScrollPane1,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														69,
														javax.swing.GroupLayout.PREFERRED_SIZE)
												.addComponent(lblObjGeneral))
								.addGap(21, 21, 21)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addComponent(lblObjEspec)
												.addComponent(
														jScrollPane2,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addGap(23, 23, 23)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.LEADING)
												.addComponent(lblMarcoTeorico)
												.addComponent(
														jScrollPane3,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														156,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.RELATED,
										37, Short.MAX_VALUE)
								.addComponent(btnSalir).addGap(29, 29, 29))
				.addGroup(
						javax.swing.GroupLayout.Alignment.TRAILING,
						layout.createSequentialGroup()
								.addContainerGap(
										javax.swing.GroupLayout.DEFAULT_SIZE,
										Short.MAX_VALUE)
								.addComponent(jLabel1)
								.addGap(18, 18, 18)
								.addComponent(jScrollPane4,
										javax.swing.GroupLayout.PREFERRED_SIZE,
										174,
										javax.swing.GroupLayout.PREFERRED_SIZE)
								.addGap(29, 29, 29)
								.addComponent(btnRecomendacion)
								.addGap(80, 80, 80)
								.addGroup(
										layout.createParallelGroup(
												javax.swing.GroupLayout.Alignment.BASELINE)
												.addComponent(jLabel2)
												.addComponent(
														cmb_calificaciones,
														javax.swing.GroupLayout.PREFERRED_SIZE,
														javax.swing.GroupLayout.DEFAULT_SIZE,
														javax.swing.GroupLayout.PREFERRED_SIZE))
								.addPreferredGap(
										javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
								.addComponent(btnCalificar)
								.addGap(113, 113, 113)));

		setSize(new java.awt.Dimension(901, 698));
		setLocationRelativeTo(null);
	}// </editor-fold>

	private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {
		PantallaInicio pantallaInicio=new PantallaInicio();
		pantallaInicio.setSize(510, 302);
		pantallaInicio.setVisible(true);
		pantallaInicio.setLocationRelativeTo(null);
		dispose();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}

	private void btnRecomendacionActionPerformed(java.awt.event.ActionEvent evt) {
		int selected[] = jList1.getSelectedIndices();

		Long codProyectoRecom = 0L;
		List<Long> idProyectos = new ArrayList<Long>();
		List<Proyecto> proyectosRecomendados = new ArrayList<Proyecto>();

		for (int i = 0; i < selected.length; i++) {
			itemSeleccionado = selected[i];
			System.out.println(itemSeleccionado);
		}

		System.out.println(proyectosArray[itemSeleccionado].getProId());

		try {
			Proyecto proyecto = FachadaBaseDeDatos.getInstance()
					.consultarProyectoPorId(
							proyectosArray[itemSeleccionado].getProId());

			String palabraClave = proyecto.getProPalclave().toUpperCase();
			FachadaBaseDeDatos.getInstance().ejecutarModelo(palabraClave);

			PGPoolingDataSource dataSource = new PGPoolingDataSource();
			dataSource.setServerName("localhost");
			dataSource.setDatabaseName("tesis");
			dataSource.setUser("postgres");
			dataSource.setPassword("P0stgressql");
			dataSource.setMaxConnections(10);

			JDBCDataModel dataModel = new PostgreSQLJDBCDataModel(dataSource,
					"RECOMENDACION", "USU_ID", "PRO_ID", "PUN_VALOR", null);

			UserSimilarity similarity = new PearsonCorrelationSimilarity(
					dataModel);
			UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
					similarity, dataModel);

			Recommender recommender = new GenericUserBasedRecommender(
					dataModel, neighborhood, similarity);

			List<RecommendedItem> recommendations = recommender.recommend(
					usuario.getUsuId(), 5);

			for (RecommendedItem recommendation : recommendations) {
				codProyectoRecom = recommendation.getItemID();
				idProyectos.add(codProyectoRecom);
				System.out.println(codProyectoRecom);
			}

			for (int i = 0; i < idProyectos.size(); i++) {
				Proyecto proyectoRecomendado = FachadaBaseDeDatos.getInstance()
						.consultarProyectoPorId(idProyectos.get(i));
				if (!proyecto.getProId().equals(proyectoRecomendado.getProId())){
					proyectosRecomendados.add(proyectoRecomendado);
				}			
			}

			PantallaInfoProyecto pantallaInfoProyecto = new PantallaInfoProyecto(
					usuario.getUsuId(), proyecto, proyectosRecomendados);
			pantallaInfoProyecto.setSize(1000, 660);
			pantallaInfoProyecto.setVisible(true);
			pantallaInfoProyecto.setLocationRelativeTo(null);
			dispose();
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	@Override
	public Image getIconImage() {
		String path = System.getProperty("user.dir");
		System.out.println(path);
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image retValue = toolkit.getImage(path + "/imagenes/icono.png");
		return retValue;
	}
	
	
    protected JTextArea createTextArea() {
        JTextArea textArea = new JTextArea();
        textArea.setWrapStyleWord(true);
        textArea.setLineWrap(true);
        return textArea;
    }

	// Variables declaration - do not modify
	private javax.swing.JButton btnRecomendacion;
	private javax.swing.JButton btnCalificar;
	private javax.swing.JButton btnSalir;
	@SuppressWarnings("rawtypes")
	private javax.swing.JComboBox cmb_calificaciones;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JLabel jLabel2;
	@SuppressWarnings("rawtypes")
	private javax.swing.JList jList1;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JScrollPane jScrollPane2;
	private javax.swing.JScrollPane jScrollPane3;
	private javax.swing.JScrollPane jScrollPane4;
	private javax.swing.JLabel lblMarcoTeorico;
	private javax.swing.JLabel lblObjEspec;
	private javax.swing.JLabel lblObjGeneral;
	private javax.swing.JLabel lblPalClaves;
	private javax.swing.JLabel lblTitulo;
	private javax.swing.JTextArea txtMarcoTeorico;
	private javax.swing.JTextArea txtObjEspec;
	private javax.swing.JTextArea txtObjGeneral;
	private javax.swing.JTextField txtPalClaves;
	private javax.swing.JTextField txtTitulo;
	// End of variables declaration
}
